/**
 * MongoDB 数据库连接测试脚本
 * 
 * 功能：
 * 1. 测试 MongoDB 数据库连接是否正常
 * 2. 验证数据库配置是否正确
 * 3. 测试基本的 CRUD 操作
 * 
 * 运行方式：
 * npx ts-node src/tests/test-mongodb-connection.ts
 */

import dotenv from 'dotenv';
import { connectMongoDB, disconnectMongoDB, testMongoDBConnection } from '../config/mongodb';
import { Book } from '../models/book.model';
import { logger } from '../utils/logger';

// 加载环境变量
dotenv.config();

/**
 * 测试数据库连接
 */
async function testConnection() {
  try {
    logger.info('='.repeat(60));
    logger.info('开始测试 MongoDB 数据库连接');
    logger.info('='.repeat(60));

    // 1. 连接数据库
    logger.info('\n步骤 1: 连接 MongoDB 数据库...');
    await connectMongoDB();
    logger.info('✅ 数据库连接成功');

    // 2. 测试连接
    logger.info('\n步骤 2: 测试数据库连接...');
    const isConnected = await testMongoDBConnection();
    if (isConnected) {
      logger.info('✅ 数据库连接测试通过');
    } else {
      throw new Error('数据库连接测试失败');
    }

    // 3. 测试创建数据
    logger.info('\n步骤 3: 测试创建图书数据...');
    const testBook = new Book({
      title: '测试图书 - Node.js 实战',
      author: '张三',
      publishDate: new Date('2023-01-01'),
      price: 99.99,
      isbn: '9787111234567',
      publisher: '测试出版社',
      category: '编程技术',
      description: '这是一本测试图书，用于验证数据库连接和 CRUD 操作。',
      stock: 100,
    });

    const savedBook = await testBook.save();
    logger.info('✅ 图书创建成功:', {
      id: savedBook._id,
      title: savedBook.title,
      author: savedBook.author,
    });

    // 4. 测试查询数据
    logger.info('\n步骤 4: 测试查询图书数据...');
    const foundBook = await Book.findById(savedBook._id);
    if (foundBook) {
      logger.info('✅ 图书查询成功:', {
        id: foundBook._id,
        title: foundBook.title,
        price: foundBook.price,
      });
    } else {
      throw new Error('查询图书失败');
    }

    // 5. 测试更新数据
    logger.info('\n步骤 5: 测试更新图书数据...');
    const updatedBook = await Book.findByIdAndUpdate(
      savedBook._id,
      { price: 88.88, stock: 200 },
      { new: true }
    );
    if (updatedBook) {
      logger.info('✅ 图书更新成功:', {
        id: updatedBook._id,
        newPrice: updatedBook.price,
        newStock: updatedBook.stock,
      });
    } else {
      throw new Error('更新图书失败');
    }

    // 6. 测试删除数据
    logger.info('\n步骤 6: 测试删除图书数据...');
    const deletedBook = await Book.findByIdAndDelete(savedBook._id);
    if (deletedBook) {
      logger.info('✅ 图书删除成功:', {
        id: deletedBook._id,
        title: deletedBook.title,
      });
    } else {
      throw new Error('删除图书失败');
    }

    // 7. 验证删除
    logger.info('\n步骤 7: 验证图书已删除...');
    const checkDeleted = await Book.findById(savedBook._id);
    if (!checkDeleted) {
      logger.info('✅ 确认图书已删除');
    } else {
      throw new Error('图书删除验证失败');
    }

    // 测试完成
    logger.info('\n' + '='.repeat(60));
    logger.info('✅ 所有测试通过！数据库连接和基本操作正常');
    logger.info('='.repeat(60));

  } catch (error) {
    logger.error('\n' + '='.repeat(60));
    logger.error('❌ 测试失败:', error);
    logger.error('='.repeat(60));
    
    if (error instanceof Error) {
      logger.error('错误信息:', error.message);
      logger.error('错误堆栈:', error.stack);
    }
  } finally {
    // 断开数据库连接
    logger.info('\n关闭数据库连接...');
    await disconnectMongoDB();
    logger.info('数据库连接已关闭');
    
    // 退出进程
    process.exit(0);
  }
}

/**
 * 测试数据库环境信息
 */
function printDatabaseInfo() {
  logger.info('\n数据库配置信息:');
  logger.info('- MONGODB_URI:', process.env.MONGODB_URI || 'mongodb://localhost:27017/library_system');
  logger.info('- NODE_ENV:', process.env.NODE_ENV || 'development');
}

// 打印数据库信息
printDatabaseInfo();

// 执行测试
testConnection();
